package com.usian.user.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    public static final String AUTHEXCHANGE = "authExchange";
    public static final String AUTHQUEUE = "authQueue";
    public static final String AUTHQUEUETEST = "authQueuetest";

    /*声明交换机
     rabbitMQ 中提供了4中交换机类型  fanout 发布订阅模式、direct routingKey模式、topic 主题模式、header 头信息模式*/

    @Bean(AUTHEXCHANGE)
    public Exchange AUTHEXCHANGE(){
        // 交换机是否持久化
        return ExchangeBuilder.directExchange(AUTHEXCHANGE).durable(true).build();
    }
    //声明队列
    @Bean(AUTHQUEUE)
    public Queue AUTHQUEUE(){
        // 队列默认持久化
        return new Queue(AUTHQUEUE);
    }
    //声明队列
    @Bean(AUTHQUEUETEST)
    public Queue AUTHQUEUETEST(){
        // 队列默认持久化
        return new Queue(AUTHQUEUETEST);
    }

    //绑定交换机和队列
    @Bean
    public Binding AUTHEXCHANGE_AUTHQUEUE(@Qualifier(AUTHEXCHANGE) Exchange exchange,@Qualifier(AUTHQUEUE) Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("auth").noargs();
    }
    @Bean
    public Binding AUTHEXCHANGE_AUTHQUEUETEST(@Qualifier(AUTHEXCHANGE) Exchange exchange,@Qualifier(AUTHQUEUETEST) Queue queue){
        return BindingBuilder.bind(queue).to(exchange).with("authtest").noargs();
    }
//  ============================================以上是普通队列

//    /** 交换机 */
//    public static final String DLX_EXCHANGE = "dlx.exchange";
//    /** 短信发送队列 延迟缓冲（按消息） */   //死信
//    public static final String QUEUE_MESSAGE_DELAY = "queue.message.delay";
//    /** 短信发送队列 */
//    public static final String QUEUE_MESSAGE = "queue.message";
//
//    /**
//     * 短信发送队列
//     * @return
//     */
//    @Bean
//    public Queue messageQueue() {
//        return new Queue(QUEUE_MESSAGE, true);
//    }
//    /***
//     * 创建交换机
//     * @return
//     */
//    @Bean
//    public DirectExchange directExchange(){
//        return new DirectExchange(DLX_EXCHANGE);
//    }
//
//    /**
//     * 短信发送队列
//     * @return
//     */
//    @Bean
//    public Queue delayMessageQueue() {
//        return QueueBuilder.durable(QUEUE_MESSAGE_DELAY)
//                .withArgument("x-dead-letter-exchange", DLX_EXCHANGE)        // 消息超时进入死信队列，绑定死信队列交换机
//                .withArgument("x-dead-letter-routing-key", QUEUE_MESSAGE)   // 绑定指定的routing-key
//                .build();
//    }

//    /***
//     * 交换机与队列绑定
//     * @param messageQueue
//     * @param directExchange
//     * @return
//     */
//    @Bean
//    public Binding basicBinding(Queue messageQueue, DirectExchange directExchange) {
//        return BindingBuilder.bind(messageQueue)
//                .to(directExchange)
//                .with(QUEUE_MESSAGE);
//    }
//    ===================================死信队列的方式实现的延时队列效果

//    public static final String AUTHEXCHANGE = "authExchangedelaty";
//    public static final String AUTHQUEUE = "authQueuedelay";
//
//    @Bean(AUTHEXCHANGE)
//    public Exchange AUTHEXCHANGE(){
//        // 交换机是否持久化
//        return ExchangeBuilder.directExchange(AUTHEXCHANGE).delayed().durable(true).build();
//    }
//    //声明队列
//    @Bean(AUTHQUEUE)
//    public Queue AUTHQUEUE(){
//        // 队列默认持久化
//        return new Queue(AUTHQUEUE);
//    }
//
//
//    //绑定交换机和队列
//    @Bean
//    public Binding AUTHEXCHANGE_AUTHQUEUE(@Qualifier(AUTHEXCHANGE) Exchange exchange,@Qualifier(AUTHQUEUE) Queue queue){
//        return BindingBuilder.bind(queue).to(exchange).with("auth").noargs();
//    }

}
